package com.webserver.core;

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.*;

/**
 * 该线程任务负责与指定客户端完成HTTP交互。
 * ClientHandler与客户端交流的流程分成三步
 * 1:解析请求
 * 2:处理请求
 * 3:发送相应
 */
public class ClientHandler implements Runnable{
    private Socket socket;

    public ClientHandler() {
    }

    public ClientHandler(Socket socket) {
        this.socket = socket;
    }

    public void run(){
        try {
            //1: 解析请求
            //1.1解析请求行。
            String line = readLine();
            System.out.println(line);
            //请求行相关信息
            String method = line.substring(0,line.indexOf(" "));//请求方式
            String uri = line.substring(line.indexOf(" ")+1,line.lastIndexOf(" "));//抽象路径
            String protocol = line.substring(line.lastIndexOf(' ')+1);//协议版本
//            String[] array = line.split("\\s");
//            method = array[0];   //获取split拆分空格前的字符串。
//            uri = array[1];      //获取split拆分字符串的第二段。
//            protocol = array[2]; //获取split拆分字符串的第三段。
            System.out.println("method: "+method);
            System.out.println("uri: "+uri);
            System.out.println("protocol: "+protocol);

            //1.2解析消息头。
            Map<String,String> headers = new HashMap<>();
//            while (true){
//                line = readLine();
//                if (line.isEmpty()){
//                    break;
//                }
//                System.out.println(line);
//            }
            //循环读取消息头信息，读取到为空串时，停止循环，消息头读取完毕！
            while (!(line = readLine()).isEmpty()){
                System.out.println("消息头: "+line);
                String key = line.substring(0,line.indexOf(": "));
                String value = line.substring(line.indexOf(": "));
                headers.put(key,value);
            }
            headers.forEach((k,v)-> System.out.println(k+v));

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private String readLine() throws IOException {
        //获取客户端发过来的消息。
        InputStream in = socket.getInputStream();
        char pre = 'a',cur;
        StringBuilder builder = new StringBuilder();
        int d;
        while ((d = in.read())!=-1){
            cur = (char)d;
            if (pre==13&&cur==10){
                break;
            }
            builder.append(cur);
            pre = cur;
        }
        return builder.toString().trim();
    }
}
